home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
050
/
colordem.pqs
/
COLORDEM.PAS
Wrap
Pascal/Delphi Source File
|
1984-12-18
|
13KB
|
342 lines
{DEMO PROGRAM TO SHOW THE COLOR GRAPHICS CAPABILITIES OF THESE PROCEDURES.
THIS PROGRAM ASSUMES STARTING IN 80 X 25 ALPHANUMERIC MODE ON THE COLOR
DISPLAY. I SUGGEST YOU DOWNLOAD THE ENTIRE PROGRAM AS ONE PIECE AND GET IT
WORKING AND THEN CHANGE ONE PART AT A TIME TO UNDERSTAND HOW IT WORKS}
{ Pset -- set point at x-y to a color
Linedraw -- draw a line from x-y to x-y
Boxdraw -- draw a box by giving opposite corner coordinates
screen -- select screen type much like basic screen command
color -- select background color and pallete }
PROGRAM COLOR_DEMO;
var
i,k : integer;
x,y : integer;
row : integer;
col : integer;
{=======================================================================}
procedure screen(sel : integer);
{=======================================================================}
{PROC TO SET SCREEN TO 320 X 200 COLOR OR 80 X 25 ALPHANUMERIC COLOR. }
{SCREEN(0) = GRAPHICS 320 X 200 }
{SCREEN(1) = ALPHANUMERIC 80 X 25 }
{ }
{=======================================================================}
type Regpack = record
AX, BX, CX, DX, BP, SI, DI, DS, ES, FLAGS: Integer;
end;
var Registers : Regpack;
AL, AH : byte;
begin
if sel = 0 then
begin
Registers.AX := $0003; {use standard bios calls to set the graphics}
Intr($10, Registers); {adapter }
end;
if sel = 1 then
begin
Registers.AX := $0004;
Intr($10, Registers);
end;
end;
{=======================================================================}
procedure color(backg , palette : integer);
{=======================================================================}
{PROC TO SET COLOR OF BACKGROUND AND PALETTE }
{WORKS LIKE BASIC GRAPHICS COLOR STATEMENT }
{ }
{=======================================================================}
var t1, t2 : integer;
begin
t1 := palette shl 5; {shift 0 or 1 into proper bit}
t1 := t1 and $0020; {mask out any other bits}
t2 := backg and $000F; {mask out all but background color select bits}
port[$03D9] := t1 or t2; {put the 2 together and send to the color select}
end; {register on the color board}
{=======================================================================}
procedure rowoff(r : integer; var mo,ro :integer);
{=======================================================================}
{PROC TO FIND MAJOR MEMORY OFFSET AND ROW OFFSET -- A SUBROUTINE }
{USED BY PSET }
{ }
{=======================================================================}
var
t1,t2 : integer;
begin
t1 := r and $01; {find major offset from row input}
if t1 = 1 then mo := $2000 else mo := $0000;
t2 := r shr 1; {find row offset}
ro := t2 * 80;
end;
{=======================================================================}
procedure coloff(c : integer; var co,dn :integer);
{=======================================================================}
{PROC TO FIND BYTE OFFSET WITHIN ROW AND DOT WITHIN BYTE -- A SUBROUTINE}
{USED BY PSET }
{ }
{=======================================================================}
begin
co := c shr 2; {find byte within column}
dn := c and $03; {find dot number within byte}
end;
{=======================================================================}
procedure dot_color(var dt0,dt1,dt2,dt3 : integer ;cn : integer);
{=======================================================================}
{PROC TO SET DOT WITHIN BYTE TO THE CORRECT COLOR -- A SUBROUTINE }
{USED BY PSET }
{ }
{=======================================================================}
begin
case cn of
0 : begin {set correct bit pattern for correct dot and color}
dt0 := $0000;
dt1 := $0000;
dt2 := $0000;
dt3 := $0000;
end;
1 : begin
dt0 := $0040;
dt1 := $0010;
dt2 := $0004;
dt3 := $0001;
end;
2 : begin
dt0 := $0080;
dt1 := $0020;
dt2 := $0008;
dt3 := $0002;
end;
3 : begin
dt0 := $00C0;
dt1 := $0030;
dt2 := $000C;
dt3 := $0003;
end;
end;
end;
{=======================================================================}
procedure pset(set_col,set_row,color_no : integer);
{=======================================================================}
{PROC TO SET A POINT AT COL AND ROW (OR X AND Y IF YOU PREFER) COORD- }
{INATES. }
{WORKS LIKE BASIC PSET STATEMENT }
{ }
{=======================================================================}
const
VideoSeg: Integer = $0B800;
var
major_offset : integer;
row_offset : integer;
col_offset : integer;
dot_no : integer;
membyte : integer;
temp : integer;
d0 : integer;
d1 : integer;
d2 : integer;
d3 : integer;
cn : integer;
begin { main code of pset proc }
rowoff(set_row,major_offset,row_offset);
coloff(set_col,col_offset,dot_no);
dot_color(d0,d1,d2,d3,color_no);
membyte := Mem[videoseg : major_offset + col_offset + row_offset];
{get byte to be changed}
{pull information from byte that was there, masking bits that}
{will be changed to zero, then set bits to be changed to proper color}
case dot_no of
0 : begin
temp := membyte and (not $C0);
membyte := temp or d0;
end;
1 : begin
temp := membyte and (not $30);
membyte := temp or d1;
end;
2 : begin
temp := membyte and (not $0C);
membyte := temp or d2;
end;
3 : begin
temp := membyte and (not $03);
membyte := temp or d3;
end;
end;
Mem[videoseg : major_offset + col_offset + row_offset] := membyte;
{put changed byte back}
end;
{=======================================================================}
Procedure Drawline(FromX,FromY,ToX,ToY,color_no:Integer);
{=======================================================================}
{PROC TO DRAW A LINE FROM X-Y COORDINATE TO A 2ND X-Y COORDINATE }
{THIS PROC WAS WRITTEN BY ALEX MARTINELLI FROM ROME }
{ }
{=======================================================================}
{ note all coords assumed to be in proper ranges - no checks done !}
var temp,Dx, Dy, XIncBefore, XIncAfter, YIncBefore, YIncAfter : Integer;
Curpoint, Accumul : Integer;
begin {drawline}
{ set 'standard values' for increments assuming line inclination
is between 0 and 45 degrees }
XIncBefore := 1 ; XIncAfter := 0 ;
YincBefore := 0 ; YIncAfter := 1 ;
{ correct for negative slopes, if any }
Dx := ToX - FromX;
if Dx<0 then begin
Dx := abs(Dx);
XIncBefore := -1 ;
end {if};
Dy := ToY - FromY;
if Dy<0 then begin
Dy := abs(Dy);
YIncAfter := -1 ;
end {if};
{ correct for line closer to vertical than to horizontal, if needed }
if Dx<Dy then begin
{ swap Dx and Dy }
Temp := Dx ;
Dx := Dy ;
Dy := Temp ;
{ swap 'before' and 'after' status for increments }
XIncAfter := XIncBefore ; XIncBefore := 0;
YIncBefore := YIncAfter ; YIncAfter := 0;
end{if};
{ now: Dx is total number of points to plot;
Dy is increment of the shorter axis per each Dx of increment
along the longer axis. }
Accumul := Dx div 2 ;
for Curpoint := 1 to Dx do begin
pset(FromX,FromY,color_no);
FromX := FromX + XIncBefore ;
FromY := FromY + YIncBefore ;
Accumul := Accumul + Dy ;
if Accumul > Dx then begin
Accumul := Accumul - Dx ;
FromX := FromX + XIncAfter ;
FromY := FromY + YIncAfter ;
end{if};
end{for};
end {Procedure Drawline};
{=======================================================================}
Procedure Drawbox(fx,fy,tx,ty,colr_no:Integer);
{=======================================================================}
{PROC TO DRAW BOX -- FX AND FY ARE FROM X FROM Y UPPER LEFT CORNER AND }
{TX AND TY ARE TO X AND TO Y LOWER RIGHT CORNER -- THIS WORKS SIMILAR }
{TO THE LINE COMMAND IN BASIC WITH THE BOX OPTION }
{ }
{=======================================================================}
begin
Drawline(fx,fy,tx,fy,colr_no); {top horizontal}
Drawline(tx,fy,tx,ty,colr_no); {right vertical}
Drawline(tx,ty,fx,ty,colr_no); {bottom horizontal}
Drawline(fx,ty,fx,fy,colr_no); {left vertical}
end;
{=======================================================================}
{START OF DEMO PROGRAM MAIN CODE }
{ 1) DRAW COLORBARS USING PSET PROCEDURE }
{ 2) DRAW VARIOUS LENGTH LINES USING LINE PROCEDURE }
{ 3) DRAW VARIOUS SIZE BOXES USING BOX DRAW PROCEDURE -- ALSO USE }
{ WRITELN TO SHOW X - Y COORDINATES AS THE BOXES ARE DRAWN }
{ }
{=======================================================================}
begin
row := 0;
col := 1;
x := 0;
y := 199;
{ start of colorbar demo }
screen(1); {set graphics mode}
color(0,0); {set background color 0, pallette 0 }
gotoxy(10,23);
writeln('COLOR BAR DEMO');
for row := 0 to 100 do {draw colorbars using pset}
begin
for col := 0 to 20 do
pset(col,row,0);
for col := 21 to 40 do
pset(col,row,1);
for col := 41 to 60 do
pset(col,row,2);
for col := 61 to 80 do
pset(col,row,3);
end;
gotoxy(10,24);
writeln('HIT RETURN TO CONTINUE');
read;
{ start of line draw demo }
screen(1); {set graphics mode again to erase the screen}
color(7,1); {change background color and pallete selection}
gotoxy(10,23);
writeln('LINE DRAW DEMO');
i := 0;
repeat
Drawline(0,0,319,I,2); {draw lines with drawline proc}
i := i + 10;
until i >= 199;
gotoxy(10,24);
writeln('HIT RETURN TO CONTINUE');
read;
{ start of box draw demo }
screen(1); {set graphics mode again to erase the screen}
color(0,0); {change background color and pallete selection}
gotoxy(28,21);
writeln('BOX DRAW DEMO');
gotoxy(28,7);
writeln('X - Y'); {this is to continually show x-y coordinates}
gotoxy(28,8); {as program draws boxes}
writeln('COORDINATES');
for k := 1 to 26 do
begin
gotoxy(28,10);
writeln('X is ',x:3);
gotoxy(28,11);
writeln('Y is ',y:3);
Drawbox(x,x,y,y,2);
x := x + 4;
y := y - 4;
end;
x := x - 2;
y := y + 2;
for k := 1 to 26 do
begin
gotoxy(28,10);
writeln('X is ',x:3);
gotoxy(28,11);
writeln('Y is ',y:3);
Drawbox(x,x,y,y,1);
x := x - 4;
y := y + 4;
end;
gotoxy(28,23);
writeln('HIT RETURN');
gotoxy(28,24);
writeln('TO CONTINUE');
read;
screen(0); {go back to alphanumeric mode to use turbo editor}
end.